﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;

namespace FlyShop
{
    public partial class FrmCadastroAeronave : Form
    {

        // Indica se o form está em modo de edição
        public bool edicao = false;

        // Código do registro a ser alterado
        public int codAeronave = 0;

        OleDbConnection conexao;
        OleDbCommand comando;
        String strConexao = "Provider=MSDAORA.1;Data Source=localhost;Persist Security Info=True;User ID=pi;Password=pi";
        String sqlInsere = "insert into aeronave (cod_aeronave, descricao, prefixo, assentos) values ((select nvl(max(cod_aeronave), 0) + 1 from aeronave), ?, ?, ?)";
        String sqlUpdate = "update aeronave set descricao = ?, prefixo = ?, assentos = ? where cod_aeronave = ?";
        String sqlConsulta = "select * from aeronave where cod_aeronave = ?";
        OleDbParameter pCod, pDescricao, pPrefixo, pQntAssentos;

        public FrmCadastroAeronave()
        {
            InitializeComponent();
        }

        private void FrmCadastroAeronave_Load(object sender, EventArgs e)
        {
            conexao = new OleDbConnection(strConexao);
            conexao.Open();

            // Se estiver em modo edição, recupera o registro
            // no banco e mostra-o no formulário
            if (edicao)
            {

                comando = new OleDbCommand(sqlConsulta, conexao);

                pCod = new OleDbParameter("cod_aeronave", OleDbType.Integer);
                pCod.Value = codAeronave;
                comando.Parameters.Add(pCod);

                OleDbDataReader dr = comando.ExecuteReader();

                if (dr.Read())
                {
                    txtDescricao.Text = dr["descricao"].ToString();
                    txtPrefixo.Text = dr["prefixo"].ToString();
                    txtQntAssentos.Text = dr["assentos"].ToString();
                }
                else
                {
                    MessageBox.Show("Erro - Edição?");
                    this.Close();
                }
            }

        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            if (valida())
            {

                // Cria o comando de acordo o estado do formulário
                if (edicao)
                {
                    comando = new OleDbCommand(sqlUpdate, conexao);

                    // Parâmetros
                    pDescricao = new OleDbParameter("descricao", OleDbType.VarChar);
                    pDescricao.Value = txtDescricao.Text.Trim();
                    comando.Parameters.Add(pDescricao);

                    pPrefixo = new OleDbParameter("prefixo", OleDbType.VarChar);
                    pPrefixo.Value = txtPrefixo.Text.Trim();
                    comando.Parameters.Add(pPrefixo);

                   
                    pQntAssentos = new OleDbParameter("assentos", OleDbType.Integer);
                    pQntAssentos.Value = int.Parse(txtQntAssentos.Text.Trim());
                    comando.Parameters.Add(pQntAssentos);

                    pCod = new OleDbParameter("cod_aeronave", OleDbType.Integer);
                    pCod.Value = codAeronave;
                    comando.Parameters.Add(pCod);

                    // Update
                    comando.ExecuteNonQuery();

                    // Fecha o formulário quando é edição
                    this.Close();
                }
                else
                {

                    comando = new OleDbCommand(sqlInsere, conexao);

                    // Parâmetros
                    pDescricao = new OleDbParameter("descricao", OleDbType.VarChar);
                    pDescricao.Value = txtDescricao.Text.Trim();
                    comando.Parameters.Add(pDescricao);

                    pPrefixo = new OleDbParameter("prefixo", OleDbType.VarChar);
                    pPrefixo.Value = txtPrefixo.Text.Trim();
                    comando.Parameters.Add(pPrefixo);


                    pQntAssentos = new OleDbParameter("assentos", OleDbType.Integer);
                    pQntAssentos.Value = int.Parse(txtQntAssentos.Text.Trim());
                    comando.Parameters.Add(pQntAssentos);

                    // Insert
                    comando.ExecuteNonQuery();


                    // Verifica se o usuário deseja inserir um novo registro
                    DialogResult resultado = MessageBox.Show(this,
                                                           "Cadastrado com sucesso.\nDeseja cadastrar outro registro?",
                                                           "Cadastro",
                                                            MessageBoxButtons.YesNo);

                    if (resultado == DialogResult.Yes)
                    {
                        // Limpa os campos
                        txtDescricao.Clear();
                        txtPrefixo.Clear();
                        txtQntAssentos.Clear();
                    }
                    else
                    {
                        this.Close();
                    }
                }
            }
        }

        public bool valida() 
        {
            String descricao = txtDescricao.Text.Trim();
            if (descricao.Length < 4 || descricao.Length > 50)
            {
                MessageBox.Show(this, "Preencha o nome corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtDescricao.Focus();
                txtDescricao.BackColor = Color.Tomato;
                return false;
            }
            else
                txtDescricao.BackColor = Color.White;

            String prefixo = txtPrefixo.Text.Trim();
            if (prefixo.Length < 1 || prefixo.Length > 8)
            {
                MessageBox.Show(this, "Preencha o prefixo corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtPrefixo.Focus();
                txtPrefixo.BackColor = Color.Tomato;
                return false;
            }
            else
                txtPrefixo.BackColor = Color.White;

            String qntAssentosString = txtQntAssentos.Text.Trim();
            if (!(qntAssentosString.Length == 0))
            {
                int qntAssentos = Int32.Parse(qntAssentosString);

                if (qntAssentos < 3 || qntAssentos > 500)
                {
                    MessageBox.Show(this, "Preencha a quantidade de assentos corretamente. Min: 3, Max: 500.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    txtQntAssentos.Focus();
                    txtQntAssentos.BackColor = Color.Tomato;
                    return false;
                }
                else
                    txtQntAssentos.BackColor = Color.White;
            }
            else
            {
                MessageBox.Show(this, "Preencha a quantidade de assentos corretamente. Min: 3, Max: 500.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtQntAssentos.Focus();
                txtQntAssentos.BackColor = Color.Tomato;
                return false;
            }

            // Se chegar aqui validou
            return true;
        }

        private void FrmCadastroAeronave_FormClosed(object sender, FormClosedEventArgs e)
        {
            conexao.Close();
        }

        private void txtQntAssentos_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                btnSalvar_Click(sender, e);
            }
        }

        private void FrmCadastroAeronave_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == (Keys.Control | Keys.S))
            {
                btnSalvar_Click(sender, e);
            }

            if (e.KeyData == (Keys.Escape))
            {
                this.Close();
            }
        }
    }
}
